/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.om.impl;

import fr.generali.accueilclient.client.om.ILien;
import fr.generali.accueilclient.client.om.IPersonne;

/**
 * Implémentation de {@link Ilien}
 * 
 * @author Guillaume Lancelin
 */
public class Lien implements ILien {

    /**
     * La personne liée
     */
    private IPersonne personneLiee;

    /**
     * Le type de lien
     */
    private String role1;

    /**
     * Le type de lien
     */
    private String role2;

    /**
     * si lien est a desactiver ou pas
     */
    private boolean lienDesactive;

    public IPersonne getPersonneLiee() {
        return personneLiee;
    }

    public void setPersonneLiee(IPersonne personneLiee) {
        this.personneLiee = personneLiee;
    }

    public String getRole1() {
        return role1;
    }

    public void setRole1(String role1) {
        this.role1 = role1;
    }

    public String getRole2() {
        return role2;
    }

    public void setRole2(String role2) {
        this.role2 = role2;
    }

    public boolean isLienDesactive() {
        return lienDesactive;
    }

    public void setLienDesactive(boolean lienDesactive) {
        this.lienDesactive = lienDesactive;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object obj) {

        boolean isEqual = false;

        if (this == obj) {

            return true;
        }

        if (obj != null && obj.getClass().getName().equals(this.getClass().getName())) {
            final ILien lienCompare = (ILien ) obj;

            boolean isLienNonNull =
                            this.getPersonneLiee() != null && this.getPersonneLiee().getNumeroClient() != null
                                            && this.getRole1() != null && this.getRole2() != null;

            boolean isLienNull =
                            (this.getPersonneLiee() == null || (this.getPersonneLiee() != null && this
                                            .getPersonneLiee().getNumeroClient() == null))
                                            && this.getRole1() == null
                                            && this.getRole2() == null;

            boolean isLienCompareNonNull =
                            lienCompare.getPersonneLiee() != null
                                            && lienCompare.getPersonneLiee().getNumeroClient() != null
                                            && lienCompare.getRole1() != null && lienCompare.getRole2() != null;

            boolean isLienCompareNull =
                            (lienCompare.getPersonneLiee() == null 
                                            || (lienCompare.getPersonneLiee() != null 
                                                            && lienCompare.getPersonneLiee().getNumeroClient() == null))
                                            && lienCompare.getRole1() == null && lienCompare.getRole2() == null;

            if (isLienNonNull && isLienCompareNonNull) {

                isEqual =
                                this.getPersonneLiee().getNumeroClient()
                                                .equals(lienCompare.getPersonneLiee().getNumeroClient());
                isEqual = isEqual && this.getRole1().equals(lienCompare.getRole1());
                isEqual = isEqual && this.getRole2().equals(lienCompare.getRole2());
            }

            if (isLienNull && isLienCompareNull) {

                isEqual = super.equals(obj);
            }

        }

        return isEqual;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {

        int hashCode = 0;

        int multiplier = 33;

        boolean isLienNonNull =
                        this.getPersonneLiee() != null && this.getPersonneLiee().getNumeroClient() != null
                                        && this.getRole1() != null && this.getRole2() != null;

        boolean isLienNull =
                        this.getPersonneLiee() == null
                                        || (this.getPersonneLiee() != null 
                                                        && this.getPersonneLiee().getNumeroClient() == null);
        isLienNull = isLienNull && this.getRole1() == null && this.getRole2() == null;

        if (isLienNonNull) {

            hashCode = multiplier * hashCode + this.getPersonneLiee().getNumeroClient().hashCode();
            hashCode = multiplier * hashCode + this.getRole1().hashCode();
            hashCode = multiplier * hashCode + this.getRole2().hashCode();
        }

        if (isLienNull) {

            hashCode = super.hashCode();
        }

        return hashCode;

    }

}
